package com.erp.handler;

import com.erp.common.CommonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

@ControllerAdvice(basePackages = "org.example.controller")
@Slf4j
public class GlobalResponseBodyHandler implements ResponseBodyAdvice {
//ResponseBodyAdvice 就是一个用于在返回值响应之前进行修改或包装的机制。
    
    @Override
    //supports 方法用于判断当前的 ResponseBodyAdvice 是否需要应用于某个方法
    public boolean supports(MethodParameter returnType, Class converterType) {
        Class responseReturnType = returnType.getMethod().getReturnType();
        log.info("returnType is {}",responseReturnType);
        log.info("converterType is {}",converterType.toString() );
        return !String.class.equals(responseReturnType) &&
        !void.class.equals(responseReturnType);
    }
    
    /*
    body：控制器方法的返回值。
    returnType：方法的返回类型。
    selectedContentType：请求的媒体类型（例如 application/json）。
    selectedConverterType：用于转换响应体的转换器类型。
    request 和 response：请求和响应对象。
    */
    @Override
    //beforeBodyWrite 方法在响应体写入之前被调用，可以用来修改响应体
    public Object beforeBodyWrite(Object body, 
                                  MethodParameter returnType,
                                  MediaType selectedContentType,
                                  Class selectedConverterType,
                                  ServerHttpRequest request,
                                  ServerHttpResponse response) {
        // 如果已经是 CommonResult 类型，则直接返回
        if (body instanceof CommonResult) {
            return body;
        }
        // 如果不是，则包装成 CommonResult 类型
        CommonResult<Object> result = new CommonResult<>();
        result.setData(body);
        return result;
    }
}